package dome5;
/*

    抽象类：
    1.抽象类不能被实例化
    2.被abstract修饰的类称为抽象类
    3.在抽象类当中可以有抽象方法或者非抽象方法，抽象类不一定包含抽象方法
    4.一个方法被abstract修饰没有具体的实现称为抽象方法，只要包含抽象方法，这个类必须是抽象类！！
    5.当一个普通类继承了这个抽象类，必须重写抽象类当中的抽象方法！

    6.抽象类存在最大的意义就是被继承

    7.抽象类方法不能被private，final，static修饰，所以，一定要满足重写的规则
    8.当一个子类没有重写抽象父类的抽象方法，可以用abstract修饰当前子类
    9.如果抽象父类A的子类B被abstract修饰了没有重写父类A的抽象方法，则需要写一个C继承B来帮助B重写A的抽象方法
    10.抽象类当中可以有构造方法，供子类创建对象时，来帮助父类初始化成员变量


    抽象类本身不能被实例化，只能创建抽象类的子类，然后让子类重写抽象类当中的抽象方法。

 */

abstract class Shape {

    public String name;

    public abstract void draw();
    public void fun() {
        ;
    }

    public Shape(String name) {
        this.name = name;
    }
}

class Rect extends Shape {
    @Override
    public void draw() {
        System.out.println(name+" 画矩形");
    }

    public Rect(String name) {
        super(name);
    }
}

class Cycle extends Shape {
    @Override
    public void draw() {
        System.out.println(name + " 画圆");
    }

    public Cycle(String name) {
        super(name);
    }
}

class Flower extends Shape {
    @Override
    public void draw() {
        System.out.println("❀");
    }

    public Flower(String name) {
        super(name);
    }
}




public class Test1 {

    public static void fucn(Shape shape) {
        shape.draw();
    }

    public static void main(String[] args) {
        Rect rect = new Rect("zhangsan");
        fucn(rect);


        fucn((new Cycle("lisi")));
    }
}
